home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_06_05 / v6n5078a.txt < prev    next >
Text File  |  1989-09-26  |  3KB  |  123 lines

  1.  
  2.  
  3. Listing 1
  4.  
  5. /* The following declarations are excerpted from my Mandelbrot
  6. program's header file; since practically the whole program
  7. consists of specialized functions useful in this task only, all
  8. variables related to the screen and to the map are global and
  9. there is relatively little ``information hiding'' and parameter
  10. passing. */
  11.  
  12. struct pt target, center;
  13. struct {double x, y;} orig;    /* this is a pixel, but it is
  14.                 stored as a double because it can easily get
  15.                 bigger than a long integer */    
  16. double a_step, b_step, a, b, xbeg, ybeg;
  17. int make_frame, imported;
  18. unsigned int scrwid, scrht, times, step, disc, pelrow, pelcol;
  19. unsigned int maxx, maxy, scrx0, scry0, discrim;
  20. unsigned long mag, ncalcs;
  21. #define VIEWAR 1.33  /* screen aspect ratio */
  22.  
  23. int iter(a,b,t,d)
  24.  
  25. double a, b;
  26. int t, d;
  27.  
  28. {
  29. register int n = 0, tt;
  30. double x, y, xx, yy, xxx;
  31. extern int chkkbd();
  32.  
  33.     x = y = 0;
  34.     tt = t;
  35.     while (n < tt && (xx = x*x) + (yy = y*y) < d)
  36.     {    xxx = xx - yy + a;
  37.         y = 2*x*y + b;
  38.         x = xxx;
  39.         n++;
  40.     }
  41.      if (chkkbd() == 27)
  42.         return -1;
  43.     if (n == t) return 0;
  44.     else return n;
  45. }    
  46.  
  47. #include <conio.h>
  48.  
  49. int chkkbd()
  50.  
  51. {
  52. extern int kbhit(), getch();
  53.  
  54.     return kbhit() ? getch() : 0;
  55. }
  56.  
  57.  
  58.  
  59. Listing 2
  60.  
  61. void makemap()
  62.  
  63. {
  64. register int n;
  65.  
  66.     for (;pelrow<scrht;pelrow++)
  67.     {    a = xbeg;
  68.         for (pelcol=0;pelcol<scrwid;)
  69.         {    n = iter(a,b,times,discrim);
  70.             ncalcs += n == 0 ? times : n;
  71.             if (n)
  72.                pset(scrx0+pelcol,scry0+pelrow,(n/step)%15+1);
  73.              a += a_step;
  74.             pelcol++;
  75.         }
  76.          b += b_step;
  77.     }
  78. }
  79.  
  80.  
  81. Listing 3
  82.  
  83. int setparms() 
  84.  
  85. double half_width, half_height, xend, yend; 
  86.  
  87.     if (scrwid != maxx)         
  88.     {    scrht = (int)(maxy * (double)scrwid/maxx); 
  89.         make_frame = 1;     /* draw a line around it */
  90.     } 
  91.     else scrht = maxy;     /* maxx by maxy would be full screen */
  92.     scrx0 = (maxx - scrwid)/2; /* upper left corner of map in
  93.                             pixel positions */
  94.     scry0 = (maxy - scrht)/2; 
  95.     center.x = target.x; 
  96.     center.y = target.y; 
  97.     discrim = disc * disc; 
  98.     half_width = (double)3.0/(2*mag);    /* total length of M is
  99.                                 3; mag == 1 shows whole
  100.                                 set */ 
  101.     xend = center.x + half_width;     /* I don't think this
  102.                             sequence of events is actually
  103.                             as silly as it looks */
  104.     half_height = half_width / VIEWAR; 
  105.     yend = center.y - half_height; 
  106.     xbeg = center.x - half_width; 
  107.     ybeg = center.y + half_height; 
  108.     a_step = (xend - xbeg) / scrwid; /* Mandelunits per pixel */
  109.     b_step = (yend - ybeg) / scrht;   /* ditto, y axis */
  110.     orig.x = scrx0 + scrwid/2 + (-center.x/a_step);    /* pixel
  111.                     location of M's origin <197> used in the
  112.                     aim-and-frame routine */
  113.     orig.y = scry0 + scrht/2 - (center.y/b_step);   
  114.      if (!imported) 
  115.     {    b = ybeg; 
  116.         pelrow = 0; 
  117.         ncalcs = 0; 
  118.     } 
  119.     else b = ybeg + b_step * pelrow; /* resume incomplete map */
  120.     imported = 0; 
  121.     return make_frame; 
  122. }